package aiserve

import (
	"context"
	"fmt"
	"time"

	models "yuanaiproblem/dao/model"
	"yuanaiproblem/migrations/db"
	"yuanaiproblem/utils"

	"github.com/sashabaranov/go-openai"
)

// DoubaoAIService 豆包AI服务（实现AIService接口）
type DoubaoAIService struct {
	client *openai.Client
	config AIConfig // 持有通用配置
}

// NewDoubaoAIService 基于通用配置创建豆包服务实例
func NewDoubaoAIService(config AIConfig) *DoubaoAIService {
	// 使用通用配置初始化OpenAI客户端
	openaiConfig := openai.DefaultConfig(config.APIKey)
	openaiConfig.BaseURL = config.BaseURL

	return &DoubaoAIService{
		client: openai.NewClientWithConfig(openaiConfig),
		config: config,
	}
}

// GenerateQuestions 实现AIService接口（适配Question实体）
func (s *DoubaoAIService) GenerateQuestions(prompt string, count int, userId int32) ([]models.Question, error) {
	// 构建标准化提示词
	fixedPrompt := utils.BuildFixedPrompt(prompt)

	// 使用配置参数构建请求
	req := openai.ChatCompletionRequest{
		Model:       s.config.Model,
		Temperature: s.config.Temperature,
		MaxTokens:   s.config.MaxTokens,
		Messages: []openai.ChatCompletionMessage{{
			Role:    openai.ChatMessageRoleUser,
			Content: fixedPrompt,
		}},
	}

	// 超时控制（从配置获取）
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(s.config.Timeout)*time.Second)
	defer cancel()

	// 调用API
	resp, err := s.client.CreateChatCompletion(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("豆包API调用失败: %w", err)
	}

	// 解析响应并映射到Question实体
	questions, err := utils.ParseAndMapResponse(resp.Choices[0].Message.Content, s.config.Model, userId)
	if err != nil {
		return nil, err
	}
	// 查询数据库中question表的最大ID并加1，作为起始值
	var startID int64
	query := "SELECT COALESCE(MAX(id), 0) + 1 FROM questions"
	if err := db.DB.Raw(query).WithContext(ctx).Scan(&startID).Error; err != nil {
		return nil, fmt.Errorf("查询起始ID失败: %v", err)
	}
	// 批量分配连续ID
	for i := range questions {
		questions[i].ID = int(startID)
		startID++
	}
	// 调整题目数量
	return utils.AdjustQuestionCount(questions, count), nil
}
